package router

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gvb_server/global"
	"gvb_server/initializa/plugin"
	"gvb_server/middleware"
	"gvb_server/models/system/resp/code"
	"gvb_server/routers/system"
	"log"
	"net/http"
)

type RouterGroup struct {
	*gin.RouterGroup
	System system.RouterGroup
}

var RouterGroupApp = new(RouterGroup)

//var RouterGroupApp = new(RouterGroup)
//
//type RouterGroup struct {
//	*gin.RouterGroup
//}

func InitRouter() *gin.Engine {
	gin.SetMode(global.Config.System.Env)
	r := gin.Default()
	err := r.SetTrustedProxies([]string{"127.0.0.1"})
	if err != nil {
		log.Panic(err)
	}

	//跨域，如需跨域可以打开下面的注释
	r.Use(middleware.Cors()) // 直接放行全部跨域请求

	// 中间件首先加载Recover，后面中间件和路由的异常信息就即可进行统一异常处理
	r.Use(Recovery())
	r.NoRoute(HandleNotFound)
	plugin.InstallPlugin(r) // 安装插件
	systemRouter := RouterGroupApp.System
	PublicGroup := r.Group("")
	{
		// 健康监测
		PublicGroup.GET("/health", func(c *gin.Context) {
			c.JSON(http.StatusOK, "ok")
		})
	}
	{
		systemRouter.InitSystemLoginRouter(PublicGroup) // 注册基础功能路由 不做鉴权

	}
	PrivateGroup := r.Group("")
	PrivateGroup.Use(middleware.JWTAuth())
	{
		systemRouter.InitSystemBaseRouter(PrivateGroup) // 注册基础功能路由 鉴权
	}

	//// 路由分组
	//{
	//	system := apiGroup.Group("/system")
	//	routerGroupApp := RouterGroup{system}
	//	// 系统配置
	//	routerGroupApp.SettingRouter()
	//}
	// 路由分组

	//{
	//	apiGroup := r.Group("/api/system")
	//	routerGroupApp := RouterGroup{apiGroup}
	//	// 系统配置
	//	routerGroupApp.SettingRouter()
	//}

	return r
}

func HandleNotFound(c *gin.Context) {
	global.Log.Warn(c.Request.Method + " " + c.Request.URL.String() + " not found")
	code.Error(c, code.NotFound, nil, c.Request.Method+" "+c.Request.URL.String()+" not found")
	return
}

func Recovery() gin.HandlerFunc {
	return func(c *gin.Context) {
		defer func() {
			if r := recover(); r != nil {
				log.Printf(" this panic: %v\n", r)
				//如果后续没动作，c.AbortWithStatusJSON其实也可以，省去了return。
				code.Error(c, code.InternalError, fmt.Errorf("%v", r), "")
				return
			}
		}()
		c.Next()
	}
}
